package webStudio7i.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import webStudio7i.excepcion.DAOExcepcion;
import webStudio7i.modelo.*;
import webStudio7i.util.ConexionBD;



public class ServiciosDAO extends BaseDAO {


	public boolean insertarServicio(Servicio vo) throws DAOExcepcion {
		System.out.println("ServicioDAO: insertar(Servicio vo)");
		String query = "INSERT INTO Servicio(nombre, descripcion, precio, idusuario_actualizacion, fechahora_creacion, fechahora_actualizacion, estado) VALUES (?,?,?,?,SYSDATE(),SYSDATE(),'1')";
		Connection con = null;
		PreparedStatement stmt = null;
		boolean rpta = false;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getNombre());
			stmt.setString(2, vo.getDescripcion());
			stmt.setDouble(3, vo.getPrecio());
			stmt.setInt(4, vo.getIdusuario_actualizacion());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}else{
				rpta =  true;
			}
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return rpta; 
	}
	
	
	// Consultar solo un servicio de la BD 
	public int ConsultarServicio(String nomServ, String descServ) throws DAOExcepcion {
		System.out.println("ServicioDAO: ConsultarServicio(String nomServ, String descServ)");
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		int cnt = 0; 
		try {
			String query = "select count(*) from Servicio where nombre=? and descripcion=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, nomServ);
			stmt.setString(2, descServ);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				cnt = rs.getInt(1);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return cnt;
	}
	
	// Consultar solo un servicio de la BD 
	public Servicio obtenerServicio(int Idservicio) throws DAOExcepcion {
		System.out.println("ServicioDAO: obtener(String ServicioNombre)");
		Servicio vo = new Servicio();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select nombre, descripcion, precio from Servicio where idservicio=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, Idservicio);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setNombre(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setPrecio(rs.getDouble(3));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}
	

	public void eliminarServicio(int Idservicio) throws DAOExcepcion {
		System.out.println("ServicioDAO: eliminar(String ServicioNombre)");
		String query = "DELETE FROM Servicio WHERE idservicio=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, Idservicio);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}


	public void actualizarServicio(Servicio vo) throws DAOExcepcion {
		System.out.println("ServicioDAO: actualizar(Servicio vo)");
		String query = "update Servicio set nombre=?, descripcion=?, precio=?,idusuario_actualizacion=?  where idservicio=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getIdservicio());
			stmt.setString(2, vo.getNombre());
			stmt.setString(3, vo.getDescripcion());
			stmt.setDouble(4, vo.getPrecio());
			stmt.setInt(5, vo.getIdusuario_actualizacion());
		
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	// Listado de todos los servicios
	public Collection<Servicio> listarServicios() throws DAOExcepcion {
		System.out.println("ServicioDAO: listar()");
		Collection<Servicio> c = new ArrayList<Servicio>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT idservicio,nombre,descripcion,precio from Servicio";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Servicio vo = new Servicio();
				vo.setIdservicio(rs.getInt("idservicio"));
				vo.setNombre(rs.getString("nombre"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setPrecio(rs.getDouble("precio"));
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

	
	
	
	/*Metodos para la clase Servicio Sala */
	public boolean insertarServicioSala(ServicioSala vo) throws DAOExcepcion {
		System.out.println("ServicioDAO: insertar(ServicioSala vo)");
		String query = "INSERT INTO servicio_sala(servicio_idservicio, sala_idsala, precio) VALUES (?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		boolean rpta = false;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getObjServicio().getIdservicio());
			stmt.setInt(2, vo.getObjSala().getIdsala());
			stmt.setDouble(3, vo.getPrecio());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}else {
				rpta = true;
				
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return rpta; 
	}

	
	public ServicioSala obtenerServicioSala(int Idservicio) throws DAOExcepcion {
		System.out.println("ServicioSalaDAO: obtener(Obj ServicioSala)");
		ServicioSala vo = new ServicioSala();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select servicio_idservicio, sala_idsala, precio from ServicioSala where servicio_idservicio=? and sala_idsala=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getObjServicio().getIdservicio());
			stmt.setInt(2, vo.getObjSala().getIdsala());
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.getObjServicio().setIdservicio((rs.getInt(1)));
				vo.getObjSala().setIdsala((rs.getInt((2))));
				vo.setPrecio(rs.getDouble(3));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}


	public void actualizarServicioSala(ServicioSala vo) throws DAOExcepcion {
		System.out.println("ServicioDAO: actualizar(Servicio vo)");
		String query = "update Servicio set precio=? where servicio_idservicio=? and sala_idsala=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getObjServicio().getIdservicio());
			stmt.setInt(2, vo.getObjSala().getIdsala());
			stmt.setDouble(3, vo.getPrecio());
		
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	
	public Collection<Servicio> ConsultarServicioxAlquiler(int idalquiler) throws DAOExcepcion {
		System.out.println("ServicioDAO: ConsultarServicioxAlquiler(Servicio serv)");
		String query ="select nombre,descripcion from alquiler, alquiler_detalle, servicio" +
				" where alquiler.idalquiler = alquiler_detalle.alquiler_idalquiler" +
				" and alquiler_detalle.servicio_idservicio = servicio.idservicio " +
				"and alquiler.idalquiler = ?"; 
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null; 
		Collection<Servicio> CltServ = new ArrayList<Servicio>();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idalquiler);
			rs = stmt.executeQuery();
			while(rs.next()){
				Servicio a = new Servicio(); 
				a.setNombre(rs.getString(1));
				a.setDescripcion(rs.getString(2));
				CltServ.add(a);
			}
			if(CltServ.size() < 1){
				throw new DAOExcepcion("No se encuentraron salas con los datos indicados");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return CltServ; 
	}
	
	
	public Collection<Servicio> ConsultarServicioxSala(int idsala) throws DAOExcepcion {
		System.out.println("ServicioDAO: ConsultarServicioxSala(int idsala)");
		String query ="select servicio.idservicio, servicio.nombre,servicio.descripcion from sala, servicio_sala, servicio" +
				" where sala.idsala = servicio_sala.sala_idsala" +
				" and servicio_sala.servicio_idservicio = servicio.idservicio " +
				"and sala.idsala = ?"; 
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null; 
		Collection<Servicio> CltServ = new ArrayList<Servicio>();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, idsala);
			rs = stmt.executeQuery();
			while(rs.next()){
				Servicio a = new Servicio();
				a.setIdservicio(rs.getInt(1));
				a.setNombre(rs.getString(2));
				a.setDescripcion(rs.getString(3));
				CltServ.add(a);
			}
			if(CltServ.size() < 1){
				throw new DAOExcepcion("No se encuentraron salas con los datos indicados");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return CltServ; 
	}
	
	public Collection<Servicio> ConsultarServicioxUsuario(String login) throws DAOExcepcion{
		System.out.println("ServicioDAO: ConsultarServicioxUsuario(String login)");
		String query ="select a.nombre from servicio a, alquiler_detalle b, alquiler c, usuario d where d.login = ? and a.idservicio=b.servicio_idservicio  and b.alquiler_idalquiler=c.idalquiler and c.usuario_idusuario=d.idusuario order by a.nombre;"; 
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null; 
		Collection<Servicio> CltServ = new ArrayList<Servicio>();
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, login);
			rs = stmt.executeQuery();
			
			while(rs.next()){
				Servicio a = new Servicio(); 
				a.setNombre(rs.getString(1));
				CltServ.add(a);
			}
			if(CltServ.size() < 1){
				throw new DAOExcepcion("No se encontraron servicios para el usuario");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return CltServ; 
	}

}
